home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1993 / MacHack 1993.toast / MacHack™ 1987-1992 / MacHack™ '90 / Utilities ƒ / MPW Tools ƒ / Simula4.07 / Simula 4.07ƒ / SInterfaces / macMenu.sim < prev    next >
Encoding:
Text File  |  1989-05-01  |  4.7 KB  |  184 lines  |  [TEXT/MPS ]

  1. % ---------------------------------------------------------------------------
  2. %    Class MACMenu
  3. % In this module you find the programmers interface to Menus.
  4. % It is built on top of the TOOLBOX routines in TOOLBOXmenus.
  5. % For a description of the routines see Inside Macintosh, chapter 11.
  6. %
  7. % 890317/Boris Magnusson
  8. % 890330/Göran Eriksson
  9. %
  10. % ---------------------------------------------------------------------------
  11.  
  12. external class toolboxmenu="::SInterfaces:toolboxmenu";
  13. external class macmenuItem="::SInterfaces:macMenuItem";
  14.  
  15. external text procedure Text_String="::SInterfaces:Text_String";
  16. external text procedure String_Text="::SInterfaces:String_Text";
  17. MacBasicMenu class MACMenu;
  18.     virtual: procedure doMenu is
  19.         procedure doMenu(menuid,item);integer menuid,item;;
  20. begin
  21.     integer NIL=0;
  22.     ref(toolboxmenu) TRAP;
  23.     short integer MenuId;  ! MenuId - the "name" of the Menu ;
  24.     
  25.     procedure doMenu(menuid,item); integer menuid,item;
  26.         inspect findItem(item) do
  27.             doMenu(menuid,item);
  28.     
  29. %        function NewMenu(menuId: INTEGER; menuTitle: Str255): MenuHandle;
  30.     procedure NewMenu(Id, menuTitle);
  31.         short integer Id; text menuTitle;
  32.     begin
  33.         text temp;
  34.         temp:-Text_string(MenuTitle);
  35.         MenuHandle:=TRAP.ToolboxNewMenu(Id, temp);
  36.         MenuId:=Id;
  37.     end;
  38.  
  39. %        FUNCTION GetMenu(rsrcID: INTEGER): MenuHandle;
  40.     Boolean procedure GetMenu(rsrcID);
  41.         short integer rsrcID;
  42.         begin
  43.             short integer  NumberOfItems, i;
  44.             MenuHandle:=TRAP.ToolboxGetMenu(rsrcID);
  45.             MenuId:=rsrcId;
  46.             if MenuHandle<>NIL then
  47.             begin
  48.                 ! insert all item notices in Q !!;
  49.                 NumberOfItems:=CountMItems;
  50.                 for i:= 1 step 1 until NumberOfItems do
  51.                     new ItemNotice.into(itemsQ);
  52.                 getMenu:=true;
  53.             end;
  54.         end;
  55.     
  56. %        PROCEDURE DisposeMenu(menu: MenuHandle);
  57.     PROCEDURE DisposeMenu;
  58.         begin
  59.             TRAP.ToolboxDisposeMenu(MenuHandle);
  60.         end;
  61.     
  62.     procedure registerItem(anItem,index); 
  63.         ref(macMenuitem) anitem; integer index;
  64.     begin
  65.         ref(itemNotice) Notice;
  66.         notice:-ItemNo(index);
  67.         notice.theitem:-anItem;
  68.         anItem.partOf:-this macMenu;
  69.         anItem.MyNo:=index;
  70.     end;
  71.     
  72.     ref(macMenuItem) procedure FindItem(index); integer index;
  73.     begin
  74.         ref(itemNotice) Notice;
  75.         Notice:-itemno(index);
  76.         if Notice =/= none then
  77.             finditem:-Notice.theitem;
  78.     end;
  79.         
  80. %        PROCEDURE AppendMenu(menu: MenuHandle; data: Str255);
  81.     PROCEDURE AppendMenu( data);
  82.         text data;
  83.         begin
  84.             text temp;
  85.             temp:-text_string(data);
  86.             TRAP.toolboxAppendMenu(MenuHandle, temp);
  87.             new itemNotice.into(itemsQ);
  88.         end;
  89.         
  90.         
  91. %        PROCEDURE AddResMenu(menu: MenuHandle; theType: ResType);
  92. %        ResType = PACKED ARRAY [1..4] OF CHAR;
  93.     PROCEDURE AddResMenu( theType);
  94.         text theType;
  95.         begin
  96.             integer theInteger;
  97.             theInteger:=OsType(theType);
  98.             TRAP.toolboxAddResMenu(MenuHandle, theInteger);
  99.             new itemNotice.into(itemsQ);
  100.         end;
  101.  
  102.  
  103. %        PROCEDURE InsertResMenu(menu: MenuHandle; theType: ResType;
  104. %                        afterItem: INTEGER);
  105.     PROCEDURE InsertResMenu(theType, afterItem);
  106.         text theType; short integer afterItem;
  107.         begin
  108.             integer theInteger;
  109.             theInteger:=OsType(theType);
  110.             TRAP.toolboxInsertResMenu(menuHandle, theInteger, afterItem);
  111.             new itemNotice.intoafter(afteritem);
  112.         end;
  113.  
  114.     
  115. %        FUNCTION CountMItems(menu: MenuHandle): INTEGER;
  116.     short integer procedure CountMItems;
  117.         CountMItems:=TRAP.toolboxCountMItems(menuHandle);
  118.  
  119. %        PROCEDURE CalcMenuSize(menu: MenuHandle);
  120.     PROCEDURE CalcMenuSize;
  121.         TRAP.toolboxCountMItems(menuHandle);
  122.  
  123. %    {new 128K ROM}
  124.  
  125. %        PROCEDURE InsMenuItem(theMenu: MenuHandle; itemString: Str255;
  126. %                    afterItem: INTEGER);
  127.     PROCEDURE InsMenuItem(itemString, afterItem);
  128.         text itemString; short integer afterItem;
  129.         begin
  130.             text temp;
  131.             temp:-text_string(itemString);
  132.             TRAP.toolboxInsMenuItem(MenuHandle, temp, afterItem);
  133.             new itemNotice.intoafter(afteritem);
  134.         end;
  135.  
  136.  
  137. %        PROCEDURE DelMenuItem(theMenu: MenuHandle; item: INTEGER);
  138.     PROCEDURE DelMenuItem(item);
  139.         short integer item;
  140.     begin
  141.         TRAP.toolboxDelMenuItem(MenuHandle, item);
  142.         delNotice(item);
  143.     end;
  144.     
  145. ! ------------------- Local routines ----------- ;
  146.     ref(head) itemsQ; ! list of items in this Menu ;
  147.     
  148.     link class ItemNotice; 
  149.     begin 
  150.         ref(macMenuitem) theItem;
  151.         procedure intoafter(no); integer no;
  152.         begin
  153.             ref(link) p;
  154.             P:-itemno(no);
  155.             if p=/=none then follow(p);
  156.         end  -- into after --;
  157.     end;
  158.     ref(link) procedure ItemNo(no); integer no;
  159.     begin
  160.         integer counter; ref(linkage) p;
  161.         p:-itemsQ.first;
  162.         for counter:=2 step 1 until no do
  163.             if p=/=none then p:-p.suc;
  164.         ItemNo:-p;
  165.     end;
  166.     procedure delNotice(no); integer no;
  167.     begin
  168.         inspect itemno(no) do out;
  169.     end;
  170.     
  171.     integer procedure ostype(thetext);text thetext;
  172.     begin ostype:=rank(thetext.getchar)*16R1000000+
  173.         rank(thetext.getchar)*16R10000+
  174.         rank(thetext.getchar)*16R100+
  175.         rank(thetext.getchar);
  176.     end;
  177.     
  178. ! -- init -- ;
  179.  
  180.     itemsQ:- new Head;
  181.     Trap:-new toolboxmenu;
  182.  
  183. end --- Mac Menu --- ;;